iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 25
1

「敏感資料」、「設定檔」...每次更改設定檔都需要重新包成映像檔,覺得很麻煩嗎?那麼你該了解一下 ConfigSecret 的用法了,學會這個用法可以省去許多麻煩,甚至可以僅更改外層資料便能夠影響容器內的世界,接下來就來看看什麼是 ConfigMapSecret 吧!

什麼是 ConfigMap

Kubernetes 中,ConfigMap 可以是扮演著字典檔的角色,以「Key」、「Values」的方式存放著「非敏感」,以不需要加密的資訊,例如:

  • 當前環境是否開啟Debug模式
  • 當前 Log 等級
## configmap.yml
apiVersion: v1               ## API 版本
kind: ConfigMap              ## 元件種類
metadata:
  name: special-config       ## ConfigMap 名稱
  namespace: default         ## ConfigMap 所屬的 Namespace
data:
  special.how: very          ## ConfigMap 資料(Key=special.how; value=very)
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
  namespace: default
data:
  log_level: INFO
## pod.yml
apiVersion: v1               ## API 版本
kind: Pod                    ## 元件種類
metadata:
  name: dapi-test-pod        ## Pod 名稱
spec:
  containers:
    - name: test-container                  ## Container 名稱
      image: k8s.gcr.io/busybox             ## Image 名稱
      command: [ "/bin/sh", "-c", "env" ]   ## Pod 啟動後,必須執行的命令
      env:                                  ## 賦予環境變數
        - name: SPECIAL_LEVEL_KEY           ## 在容器內的變數名稱
          valueFrom:                        ## 指定值從名稱為 special-config 的 ConfigMap 中取得 key 名稱為「special.how」取得
            configMapKeyRef:
              name: special-config
              key: special.how
        - name: LOG_LEVEL                   ## 在容器內的變數名稱
          valueFrom:
            configMapKeyRef:                ## 指定值從名稱為 env-config 的 ConfigMap 中取得 key 名稱為「log_level」取得
              name: env-config
              key: log_level
  restartPolicy: Never

當啟動服務後,可以看見Pod的輸出包括環境變量SPECIAL_LEVEL_KEY=veryLOG_LEVEL=INFO

另外也可以扮演設定檔掛載的角色,例如:

  • nginx.conf 設定檔
  • redis.conf 設定檔
  • 程式內需要用的 env 檔案
# 撰寫 nginx 設定檔
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-map
data:
  test.conf: |
    server {
      listen       80;
      server_name  zxc.com;
  
      location / {
          root  /home/nginx_html ;
          index index.html index.htm;
      }
    }
  test1.conf: |
    server {
      listen       80;
      server_name  abc.com;
  
      location / {
          root  /home/nginx_html ;
          index index1.html index1.htm;
      }
    }
---
## 佈署容器服務,此時服務尚未對外,僅供容器內彼此溝通
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      service: http-server
  template:
    metadata:
      labels:
        service: http-server
    spec:
      containers:
      - name: nginx
        image: 10.28.16.107:8899/library/demo-nginx:0.1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /etc/nginx/conf.d # mount nginx-conf volumn to /etc/nginx/conf.d
          readOnly: true
          name: deployment-nginx-conf
      volumes:
        - name: deployment-nginx-conf
          configMap:
            name: nginx-map # place ConfigMap `nginx-conf` on /etc/nginx

---
## 新增對外服務
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    service: http-server
  ports:
  - port: 80
    targetPort: 80

什麼是 Secret

SecretConfigMap 相同用法,只是對象類型適用於保護「敏感資料」,例如:

  • DB 帳號密碼
  • OAuth 令牌
  • SSH Key
  • Redis 密碼資料統一由 Secret作為保存,在放置容器服務內提供程式做使用

這些敏感資料都將由 Secret 保存著,在提供 Container 使用。

##secret.yml
apiVersion: v1               ## API 版本
kind: Secret                 ## 元件種類
metadata:
  name: mysecret             ## Secret 名稱
type: Opaque                 ## 是一個map結構(key-value),其中vlaue要求以base64格式編碼
data:                        ## 存放隱私資料,以「key:value」呈現
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm
## pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: mycontainer
    image: redis
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
  restartPolicy: Never

以上就是 ConfigMapSecret 的說明與示範


上一篇
Day24 了解 K8S 的 Ingress
下一篇
Day26 了解 K8S 的 Volumes & StorageClass
系列文
就是「懶」才更需要重視DevOps30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言